package br.ufrj.dcc.ia.jogadores;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Currency;
import java.util.List;

import br.ufrj.dcc.ia.blackjack.Rodada;
import br.ufrj.dcc.ia.excecoes.PartidaException;
import br.ufrj.dcc.ia.utils.Carta;

public abstract class Player {

	public final Double DINHEIRO = 1000.0;

	public List<Carta> mao = new ArrayList<Carta>();

	public String nome;

	public Double dinheiro;

	public Double aposta;

	public Boolean participando;

	public int vitorias = 0;

	public int derrotas = 0;

	public int empates = 0;

	public boolean perdeuUltima = false;

	public Player(String nome) {
		this.nome = nome;
		this.dinheiro = DINHEIRO;
		this.aposta = 0.0;
		this.participando = true;
	}

	public void incVitorias() {
		vitorias++;
	}

	public void incDerrotas() {
		derrotas++;
	}

	public void incEmpates() {
		empates++;
	}

	public Boolean getParticipando() {
		return participando;
	}

	public void setParticipando(Boolean participando) {
		this.participando = participando;
	}

	public Double getAposta() {
		return aposta;
	}

	public void setAposta(Double aposta) {
		this.aposta = aposta;
	}

	public Double getDinheiro() {
		return dinheiro;
	}

	public void setDinheiro(Double dinheiro) {
		this.dinheiro = dinheiro;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public List<Carta> getMao() {
		return mao;
	}

	public void setMao(List<Carta> mao) {
		this.mao = mao;
	}

	public Integer getPontuacaoCorrente() {
		int pontuacao = 0;
		for (Carta c : mao) {
			pontuacao += c.getPontos();
		}
		return pontuacao;
	}

	public void hit(List<Carta> baralhoPartida) throws PartidaException {
		if (baralhoPartida.size() == 0) {
			throw new PartidaException();
		}
		Carta cartaComprada = baralhoPartida.get(0);
		this.getMao().add(cartaComprada);
		baralhoPartida.remove(cartaComprada);
		System.out.println(this.getNome() + " comprou "
				+ cartaComprada.toString() + " - "
				+ this.getPontuacaoCorrente() + " pontos.");
	}

	public void doubleHit(List<Carta> baralhoPartida) throws PartidaException {
		this.hit(baralhoPartida);
		if(this.aposta > this.dinheiro){
			this.aposta += (this.dinheiro);
			this.dinheiro = 0.0;
		}
		else{
			this.dinheiro -= this.aposta;
			this.aposta *= 2;
		}
	}

	public void surrender() {
		this.dinheiro += this.aposta / 2;
	}

	public void stand() {

	}

	public abstract void apostar();

	public abstract boolean jogar(Rodada rodada) throws PartidaException;

	public int getVitorias() {
		return vitorias;
	}

	public void setVitorias(int vitorias) {
		this.vitorias = vitorias;
	}

	public int getDerrotas() {
		return derrotas;
	}

	public void setDerrotas(int derrotas) {
		this.derrotas = derrotas;
	}

	public int getEmpates() {
		return empates;
	}

	public void setEmpates(int empates) {
		this.empates = empates;
	}

	public boolean isPerdeuUltima() {
		return perdeuUltima;
	}

	public void setPerdeuUltima(boolean perdeuUltima) {
		this.perdeuUltima = perdeuUltima;
	}

	Boolean martingale;

	Boolean primeiraAposta = true;
	
	public void apostaMartingale() {
		if (primeiraAposta) {
			this.setAposta(5.0);
			primeiraAposta = false;
		} else {
			if(!perdeuUltima){
				this.setAposta(5.0);
			}else {
				if(!(this.aposta*2 > this.dinheiro)){
					this.setAposta(aposta * 2);
				}else{
					this.aposta = this.dinheiro;
				}
				perdeuUltima = false;
			}
		}
	}

}
